package com.edev.support.utils;

import lombok.NonNull;

/**
 * 命名规范转换工具类（静态方法）
 * 
 * 核心功能：
 * 1. 下划线命名与驼峰命名互转
 * 2. 首字母大写格式处理
 * 
 * 典型使用场景：
 * - ORM框架字段名映射（如：数据库字段名到Java属性名）
 * - REST API参数格式转换（如：JSON属性名到Java变量名）
 * 
 * 注意事项：
 * - 所有方法均为静态方法，不可实例化
 * - 输入参数需符合基本命名规范（不含特殊字符）
 */
public class NameUtils {
    private NameUtils() {}
    /**
     * 下划线转驼峰命名（自动处理多下划线场景），
     * 实现逻辑：
     * 1. 循环处理所有下划线字符
     * 2. 将下划线后第一个字母转为大写
     * 3. 删除下划线并拼接字符串
     * @param name 下划线格式字符串（如：user_name）
     * @return 驼峰格式字符串（如：userName）
     */
    public static String convertToCamelCase(@NonNull String name) {
        while (name.contains("_")) {
            name = underlineChange(name);
        }
        return name;
    }

    /**
     * 驼峰命名转下划线格式（全小写），
     * 转换规则：
     * 1. 大写字母前添加下划线
     * 2. 最终结果转为全小写
     * @param name 驼峰格式字符串（如：UserName）
     * @return 下划线格式字符串（如：user_name）
     * 
     */
    public static String convertToUnderline(@NonNull String name) {
        StringBuilder result = new StringBuilder();
        char[] chars = name.toCharArray();
        for(char c : chars)
            if(c>='A'&&c<='Z') result.append("_").append(c);
            else result.append(c);
        return result.toString().toLowerCase();
    }

    /**
     * 首字母大写转换（适用于类名的生成），
     * 注意：
     * - 输入字符串长度必须≥1
     * - 原首字母需为小写字母（ASCII规则）
     * @param name 原始字符串（如：name）
     * @return 首字母大写字符串（如：Name）
     */
    public static String convertToFirstUpperCase(@NonNull String name) {
        char[] chars = name.toCharArray();
        chars[0] -= 32;
        return String.valueOf(chars);
    }
    
    // 下划线转换辅助方法
    private static String underlineChange(@NonNull String name) {
        int index = name.indexOf("_");
        String prefix = name.substring(0, index);
        String first = name.substring(index+1, index+2).toUpperCase();
        String suffix = name.substring(index+2);
        return prefix + first + suffix;
    }
}
